<?php

// 使用PHP内置的扩展函数和类来实现一个简单的RPC

/**
 * 服务端
 */


// 定义要远程调用的函数
function add($a, $b) {
    return $a + $b;
}

// 创建一个socket并绑定到一个端口
$host = 'localhost';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

while (true) {
    // 接受客户端的连接请求
    $clientSocket = socket_accept($socket);

    // 接收客户端发送的数据
    $data = socket_read($clientSocket, 1024);

    // 将接收到的数据解析为函数调用参数
    $parts = explode(' ', $data);
    $functionName = array_shift($parts);
    $arguments = explode(',', implode(' ', $parts));

    // 调用相应的函数并获取结果
    $result = call_user_func_array($functionName, $arguments);

    // 将结果转换为字符串并发送给客户端
    $resultString = var_export($result, true);
    socket_write($clientSocket, $resultString . "\n");

    // 关闭客户端连接和清理资源
    socket_close($clientSocket);
}


// 在上面的代码中，我们首先定义了一个名为add的函数，它接受两个参数并返回它们的和。然后，我们创建一个socket并绑定到一个端口。接下来，我们使用一个无限循环来接受客户端的连接请求。当有新的连接请求时，我们通过socket_accept函数接受连接。然后，我们使用socket_read函数接收客户端发送的数据，并将其解析为函数调用参数。接下来，我们使用call_user_func_array函数调用相应的函数，并将结果转换为字符串。最后，我们使用socket_write函数将结果发送给客户端。